import { RouteRecordRaw } from 'vue-router';
import { formatTwoStageRoutes, formatFlatteningRoutes } from '@renderer/router/index';
import { dynamicRoutes, notFoundAndNoPower } from '@renderer/router/route';
import { useTagsViewRoutes } from '@renderer/stores/tagsViewRoutes';
import { useRoutesList } from '@renderer/stores/routesList';
import { NextLoading } from '@renderer/utils/loading';
import { Pinia } from 'pinia';
import { Router } from 'vue-router';

// 前端控制路由

/**
 * 前端控制路由：初始化方法，防止刷新时路由丢失
 * @param pinia 当前应用的pinia实例
 * @param router 当前应用的router实例
 */
export async function initFrontEndControlRoutes(pinia: Pinia, router: Router) {
	// 界面 loading 动画开始执行
	if (window.nextLoading === undefined) NextLoading.start();
	await setAddRoute(pinia, router);
	// 设置路由到 pinia 中及缓存处理
	setFilterMenuAndCacheTagsViewRoutes(pinia);
}

/**
 * 添加路由到路由实例
 * @param pinia 当前应用的pinia实例
 * @param router 当前应用的router实例
 */
export async function setAddRoute(pinia: Pinia, router: Router) {
	(await setFilterRouteEnd(pinia)).forEach((route: RouteRecordRaw) => {
		router.addRoute(route);
	});
}

/**
 * 重置路由
 * @param pinia 当前应用的pinia实例
 * @param router 当前应用的router实例
 */
export async function frontEndsResetRoute(pinia: Pinia, router: Router) {
	(await setFilterRouteEnd(pinia)).forEach((route: RouteRecordRaw) => {
		const routeName: any = route.name;
		router.hasRoute(routeName) && router.removeRoute(routeName);
	});
}

/**
 * 获取所有路由数组，不再进行角色过滤
 * @param pinia 当前应用的pinia实例
 * @returns 返回所有路由数组
 */
export function setFilterRouteEnd(pinia: Pinia) {
	let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes), pinia);
	// 添加404、401路由
	filterRouteEnd[0].children = [...filterRouteEnd[0].children, ...notFoundAndNoPower];
	return filterRouteEnd;
}

/**
 * 直接返回所有路由，不做过滤
 */
export function setFilterRoute(chil: any) {
	return chil.map((route: any) => ({ ...route }));
}

/**
 * 缓存所有路由（未过滤隐藏的isHide）
 * @param pinia 当前应用的pinia实例
 */
export function setCacheTagsViewRoutes(pinia: Pinia) {
	const storesTagsView = useTagsViewRoutes(pinia);
	// 不再进行角色过滤，直接使用所有动态路由
	let allRoutes = dynamicRoutes;
	// 添加到 pinia 中
	storesTagsView.setTagsViewRoutes(formatTwoStageRoutes(formatFlatteningRoutes(allRoutes), pinia)[0].children);
}

/**
 * 设置所有路由到 pinia 中（已处理成多级嵌套路由）及缓存处理
 * @param pinia 当前应用的pinia实例
 */
export function setFilterMenuAndCacheTagsViewRoutes(pinia: Pinia) {
	const storesRoutesList = useRoutesList(pinia);
	storesRoutesList.setRoutesList(dynamicRoutes[0].children);
	setCacheTagsViewRoutes(pinia);
}
    